/********
 *      消息结构
 * AA 55 len type data crc16
 * len ：为后面data的长度
 * crc16 ：xmodem格式,计算除crc16之外的部分
 * */

#ifndef __XD_MESSAGE_H
#define __XD_MESSAGE_H
#include "main.h"
#include "stdint.h"

#define HEADER_LENGTH       6
#define ERROR_NUM           4
typedef enum {
    XD_GET_HARDVER = 0x20,
    XD_GET_SOFTVER,
    XD_SET_HOMESTATUS,
    XD_GET_HOMESTATUS,
    XD_SET_ZERO,
    XD_GET_UID,
    XD_GET_ERR,
    XD_GET_PIPE,
    XD_GRB_PANEL_DISPALY,
    XD_CAR_SPEED,

    CARD_RE_HARDVER = XD_GET_HARDVER+0x20,
    CARD_RE_SOFTVER,
    CARD_RE_SET_HOMESTATUS,
    CARD_RE_GET_HOMESTATUS,
    CARD_RE_SET_ZERO,
    CARD_RE_GET_UID,
    CARD_UP_ERR,
    CARD_UP_PIPE,
    CARD_RE_GRB_PANEL_DISPALY,
    CARD_RE_CAR_SPEED,

    XD_CYCLE_DOWN = 0x80,
    CARD_CYCLE_UP = 0x90,

    EX_REQ_SetYawLevel = 0xfe,
    EX_Device_Control = 0xff
}XD_MESSAGES;

typedef struct {
    int type;
    uint8_t* data;
    int data_len;
}xd_message_t;

typedef __PACKED_STRUCT
{
    uint8_t enBits;         //  后续每个字段的使能位，从bit0开始
    int target[3];          //  最多三个电机的目标位置/速度/力矩
    uint8_t dout[2];        //  最多16个数字量输出
    uint16_t pwmout[4];     //  最多4个pwm的输出
}xd_cycle_down_t;

typedef __PACKED_STRUCT
{
    int actual[3];          // 最多三个电机的实时位置/速度/力矩
    uint8_t din[2];         // 最多16个数字量输入
    uint16_t ain[3];        // 3个AI输入，后续可以实际需求增减
}card_cycle_up_t;

typedef __PACKED_STRUCT
{
    char c1;                // 要显示的第一个字符
    char c2;                // 要显示的第二个字符
    uint8_t g;              // 字符的G颜色分量
    uint8_t r;              // 字符的R颜色分量
    uint8_t b;              // 字符的B颜色分量
}xd_grb_panel_t;



void xd_message_set_send_func(uint16_t(*func)(void const*,uint32_t));
void XD_Message_Received(xd_message_t* msg);


#endif


